/*
 * Copyright (C) 2012 Jonathan St-Michel <jonathan@abiwebz.net>
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package org.abiwebz.platform.util;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.ListIterator;
import javax.swing.JOptionPane;
import org.abiwebz.platform.Application;

/**
 *
 * @author stmicj
 */
public class ErrorHandling {

    /********* SINGLETON *****************************************************/
    protected static ErrorHandling singletonInstance = null;

    /**
     * Retourner une copie de l'application pour récupérer les informations
     * répertoriées au démarrage de celle-ci.
     * 
     * @return Une copie de l'application
     */
    public static ErrorHandling getInstance() {
        return ErrorHandling.singletonInstance;
    }

    /**
     * Créer selon la technique du "singleton" l'instance de la classe 
     * Application qui pourra être récupérée de n'importe où.
     * 
     * @return Une copie de la nouvelle application
     */
    public static ErrorHandling newInstance() {
        ErrorHandling.singletonInstance = new ErrorHandling();
        return ErrorHandling.getInstance();
    }

    /*************************************************************************/
    
    //Contient les définitions des messages
    private ArrayList<MessagesDefinitions> definitions;
    
    private ErrorHandling() {
        this.definitions = new ArrayList<MessagesDefinitions> ();
        
    }
    
    public void addDefinitions(String name, InputStream istream){
        try {
            MessagesDefinitions md = new MessagesDefinitions(name, Application.showErrorCodeSwitch);
            md.load(istream);
            this.definitions.add(md);
        } catch (IOException ex) {
            //Logger.getLogger(ErrorHandling.class.getName()).log(Level.SEVERE, null, ex);
        }
        
    }
    
    /**
     * Afficher le message d'erreur selon le ID demandé. Le texte utilisé est 
     * retrouvé dans le répertoire de définitions selon le ID.
     * 
     * @param id Code du message à afficher
     */
    public void error(String id, String name){
        JOptionPane.showMessageDialog(null, getMessage(id, name), "Erreur", JOptionPane.ERROR_MESSAGE);
    }
    
    public int confirm(String id, String name){
        return JOptionPane.showConfirmDialog(null, getMessage(id, name), "Confirmation", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
    }
    
    /**
     * Retrouver le message selon le id. La «switche» qui permet d'afficher le
     * code d'erreur dans le message est traitée ici.
     * 
     * @param id Code du message à afficher
     * @return Le message à afficher
     */
    private String getMessage(String id, String name){
        ListIterator<MessagesDefinitions> it = this.definitions.listIterator();
        MessagesDefinitions md;
        while(it.hasNext()){
            md = it.next();
            if(name.equals(md.getName())){
                return md.getProperty(id);
            }
        }
        return "Erreur inconnue";
    }
    
}
